giallorossy1989@mail.ru
Вибачте, що міш-маш із мовами, не встиг всі лекції перекласти, да і граматичних помилок вистачає (.
ЛЕКЦІЯ
ВИКОРИСТАННЯ ОПЕРАЦІЙ
С# дозволяє перевизначити дії більшості операцій так, щоб при використанні з об’єктами конкретного класу вони виконували задані функції. Визначення власних операцій класу називають перезавантаженням операцій.
Синтаксис:
[aтрибути] спеціфікатори об’явник_операції тіло
В якості спеціфікаторів одночасно використовуються ключові слова public і static. Крім того операцію можливо об’являти як зовнішню [extern].
Об’явник_операції – містить ключове слово operator.
Тіло операції – визначає дії, які виконуються при використанні операцій у виразах. Тіло представляє собою блок який аналогічний тілу інших методів.
Зауваження: нові позначення для власних операцій вводити не можна. Для операцій класу зберігаються кількість аргументів, пріоритети операцій і правила асоціацій, які використовуються у стандартних типах даних.
Правила:
операція повинна бути описана, як відкритий статичний метод класу (public static);
параметри в операцію повинні передаватись за значенням (тобто не можна використовувати ref або out);
сигнатури для всіх операцій класу повинні різними;
типи, які використовуються в операції, повинні мати не менші права доступу ніж сама операція.
Існують три типи операцій класу: унарні, бінарні і операції перетворення типів.
Унарні операції
+ - ! ~ ++ -- true false
Синтаксис:
тип operator унарна_операція (параметр)
Приклади:
public static int operator +(MyObject m)
public static bool operator true(MyObject m)
Параметр, який передається в операцію, повинен мати тип для якого вона визначається.
Операція повинна повертати:
+, - , !, ~ - величину довільного типу;
++, --, - величину, яка має тип класу для якого вона визначена;
true, false – величину типу bool.
Операції не повинні змінювати значення параметрів, які їм передаються. Операція, яка повертає величину типу класу, для якого вона визначена, повинна створювати новий об’єкт цього класу, виконувати з ним необхідні дії і передавати його у якості результату.
Зауваження: Префіксний і постфіксний інкременти не розрізняються (для них може існувати тільки одна реалізація, яка викликається в обох випадках )
Приклад:
class SafeArray
{
int[] a;
int length;
public SafeArray(int size)
{
a = new int[size];
length = size;
}
public SafeArray(params int[] arr)
{
length = arr.Length;
a = new int[length];
for (int i = 0; i < length; ++i)
a[i] = arr[i];
}
public static SafeArray operator ++(SafeArray x)
{
SafeArray temp = new SafeArray(x.length);
for (int i = 0; i < x.length; ++i)
temp[i] = ++x.a[i];
return temp;
}
public int this[int i]
{
get
{
if (i >= 0 && i < length) return a[i];
else throw new IndexOutOfRangeException();
}
set
{
if (i >= 0 && i < length) a[i] = value;
else throw new IndexOutOfRangeException();
}
}
public void Print(string name)
{
Console.WriteLine(name + ":");
for (int i = 0; i < length; ++i)
Console.Write("\t"+a[i]);
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
try
{
SafeArray a1 = new SafeArray(5, 2, -1, 100, -2);
a1.Print("Masiv 1");
a1++;
a1.Print("Increment masiva 1");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
Описание класса:
class Point2D
{
float x,y;
Point2D()
{ x...